"""
多继承的演示例

问题：重写后，如何访问父类的成员？
    答案：
        方式1：父类名.父类方法名(self)
        方式2：super().父类方法名()


注意：
    1：需要分清楚多层继承和多继承的区别
    2：多继承：1个类有多个父类。
    3：多层继承：继承的传递性，A->B->C
"""
# 1: 先定义类
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def teach(self):
        print(f"{self.name}，锻炼最基本的生活技能。")

class Father(Person):
    def teach(self):
        super().teach()
        print(f"{self.name}，通过黑马程序员线下学习课程。")

class Mother(Person):
    def teach(self):
        super().teach()
        print(f"{self.name}，通过博学谷线上学习课程。")

class Child(Father, Mother):
    def teach(self):
        Father.teach(self)
        Mother.teach(self)
        print(f"{self.name}，通过强化学习方式进行教育，提升自身能力。")

if __name__ == '__main__':
    # 2：创建对象
    c = Child("张三", 18)
    c.teach()
    # 通过子类名.mro()或者__mro__属性获取继承关系
    print(Child.mro())

"""
1: 调用c.teach(),就是调用Child的teach()
    首先调用Father.teach(self)， 这里的self是Child的实例c
    然后调用Mother.teach(self)，
    最后打印自己的内容
2：进入Father的teach()
    Father的teach()，第一行代码是super().teach()，Father的下一个类是Monther
    因为Child的Mro是Child-》Father-》Monther-》Person-》object， 所以在Father中调用super()会找到Monther的super()
    因此此时执行的是Mother的teach方法。
3：进入Mother的teach方法。 
    Mother的teach方法中，第一行代码也是super().teach(), 根据Mro执行顺序，会调用Person的teach()
4：进入Person的teach方法  
    第一次打印：张三，锻炼最基本的生活技能。
5：回到Mother的teach方法，执行下一行
    第二次打印：张三，通过博学谷线上学习课程。
6：回到Father的teach方法，执行下一行
    第三次打印：张三，通过黑马程序员线下学习课程。
7：回到Child的teach方法
    接着调用Mother.teach(self)，因此会再次进入Mother的teach方法。
8：再次进入Mother的teach方法。
    同样调用super().teach(), 此时再次进入Person的teach方法。
    第四次打印：张三，锻炼最基本的生活技能。
    第五次打印：张三，通过博学谷线上学习课程。
9：回到Child的teach方法
    第六次打印：张三，通过强化学习方式进行教育，提升自身能力。
"""

"""

张三，锻炼最基本的生活技能。
张三，通过博学谷线上学习课程。
张三，通过黑马程序员线下学习课程。
张三，锻炼最基本的生活技能。
张三，通过博学谷线上学习课程。
张三，通过强化学习方式进行教育，提升自身能力。
[<class '__main__.Child'>, <class '__main__.Father'>, <class '__main__.Monther'>, <class '__main__.Person'>, <class 'object'>]

张三，通过强化学习方式进行教育，提升自身能力。
[<class '__main__.Child'>, <class '__main__.Father'>, <class '__main__.Monther'>, <class '__main__.Person'>, <class 'object'>]


"""
